/********************************************************************************
  * @file     SD93F115B_iic.c
  * @author   TEST TEAM 												    	
  * @version  v0															    	
  * @date     Septemper 2022												    	
  * @brief
  *
  * Copyright (C) 2022  Hangzhou SDIC Microelectronics Co., Ltd
**********************************************************************************/

/****************Includes*************/
#include "SD93F115B_i2c.h"
#include "SD93F115B_rcc.h"


/*-----------------------------------------------------
 * 函数功能：将IIC相关寄存器初始化为上电默认值
 * 入口参数：None
 * 出口参数：None
 * 返回值  ：None
 * 编写日期：
 * 作者    ：
 *-----------------------------------------------------*/
void I2C_DeInit(void)
{	
	RCC_APBPeriphResetCmd(RCC_APBPeriph_I2C, ENABLE);
	RCC_APBPeriphResetCmd(RCC_APBPeriph_I2C, DISABLE); 
}

/*----------------------------------------------------
 * 函数功能：IIC初始化
 * 入口参数：I2C_InitStruct: pointer to a I2C_InitTypeDef structure that
 *           contains the configuration information for the specified I2C peripheral.
 * 出口参数：None
 * 返回值  ：None
 * 编写日期：
 * 作者    ：
 *----------------------------------------------------*/
void I2C_Init(I2C_InitTypeDef* I2C_InitStruct)
{
	/* Check the parameters */
	assert_param(IS_FUNCTIONAL_STATE(NewState));
	assert_param(IS_I2C_BaudRatePrescaler(I2C_InitStruct->I2C_BaudRatePrescaler));
	assert_param(IS_I2C_Mode(I2C_InitStruct->I2C_Mode));
	assert_param(IS_I2C_AddressMode(I2C_InitStruct->I2C_AddressMode));

	I2C->BRR=I2C_InitStruct->I2C_BaudRatePrescaler;
	
	I2C_GenerateACKCmd(I2C_InitStruct->I2C_Generate_Ack);
	I2C->OAR |=I2C_InitStruct->I2C_AddressMode;
	I2C->CR |=I2C_InitStruct->I2C_Mode;
	
}

/*-----------------------------------------------
 * 函数功能：IIC使能
 * 入口参数：NewState: ENABLE, DISABLE
 * 出口参数：None
 * 返回值  ：None
 * 编写日期：
 * 作者    ：
 *-----------------------------------------------*/
void I2C_Cmd(FunctionalState NewState)
{
	/* Check the parameters */
	assert_param(IS_FUNCTIONAL_STATE(NewState));
	if (NewState != DISABLE)
	{

		I2C->CR |= I2C_CR_I2CEN;
	}
	else
	{
		I2C->CR &= (uint32_t)~(I2C_CR_I2CEN);
	}
	
}

/*-----------------------------------------------
 * 函数功能：配置I2C的工作模式，主机或从机
 * 入口参数：I2C_Mode: I2C_Mode_Master,I2C_Mode_Salve
 * 出口参数：None
 * 返回值  ：None
 * 编写日期：
 * 作者    ：
 *-----------------------------------------------*/
void I2C_ModeConfig(uint32_t I2C_Mode)
{
	assert_param(IS_I2C_Mode(I2C_Mode));
	I2C->CR |= I2C_Mode;
}

/*-----------------------------------------------
 * 函数功能：使能I2C产生应答信号
 * 入口参数：NewState: ENABLE, DISABLE
 * 出口参数：None
 * 返回值  ：None
 * 编写日期：
 * 作者    ：
 *-----------------------------------------------*/
void I2C_GenerateACKCmd(FunctionalState NewState)
{
	/* Check the parameters */
	assert_param(IS_FUNCTIONAL_STATE(NewState));
	
	if (NewState != DISABLE)
	{

		I2C->CR |= I2C_CR_ACK;
	}
	else
	{
		I2C->CR &= (uint32_t)~(I2C_CR_ACK);
	}
}

/*-----------------------------------------------
 * 函数功能：使能I2C主机模式下产生起始信号
 * 入口参数：NewState: ENABLE, DISABLE
 * 出口参数：None
 * 返回值  ：None
 * 编写日期：
 * 作者    ：
 *-----------------------------------------------*/
void I2C_GenerateStartCmd(FunctionalState NewState)
{
	/* Check the parameters */
	assert_param(IS_FUNCTIONAL_STATE(NewState));
	
	if (NewState != DISABLE)
	{

		I2C->CR |= I2C_CR_START;
	}
	else
	{
		I2C->CR &= (uint32_t)~(I2C_CR_START);
	}
}

/*-----------------------------------------------
 * 函数功能：使能I2C主机模式下产生停止信号
 * 入口参数：NewState: ENABLE, DISABLE
 * 出口参数：None
 * 返回值  ：None
 * 编写日期：
 * 作者    ：
 *-----------------------------------------------*/
void I2C_GenerateStopCmd(FunctionalState NewState)
{
	/* Check the parameters */
	assert_param(IS_FUNCTIONAL_STATE(NewState));
	
	if (NewState != DISABLE)
	{

		I2C->CR |= I2C_CR_STOP;
	}
	else
	{
		I2C->CR &= (uint32_t)~(I2C_CR_STOP);
	}
}

/*-----------------------------------------------
 * 函数功能：使能I2C从机模式下禁止时钟延长
 * 入口参数：NewState: ENABLE, DISABLE
 * 出口参数：None
 * 返回值  ：None
 * 编写日期：
 * 作者    ：
 *-----------------------------------------------*/
void I2C_NOStretchClockCmd(FunctionalState NewState)
{
	/* Check the parameters */
	assert_param(IS_FUNCTIONAL_STATE(NewState));
	
	if (NewState != DISABLE)
	{

		I2C->CR |= I2C_CR_NOSTRETCH;
	}
	else
	{
		I2C->CR &= (uint32_t)~(I2C_CR_NOSTRETCH);
	}
}

/*---------------------------------------------------
 * 函数功能：使能主机接收模式下的关闭通信方式时，
 *           读取1次数据，默认（DISBALE)读取两次
 * 入口参数：NewState: ENABLE, DISABLE
 * 出口参数：None
 * 返回值  ：None
 * 编写日期：
 * 作者    ：
 *---------------------------------------------------*/
void I2C_MRStopModeCmd(FunctionalState NewState)
{
	/* Check the parameters */
	assert_param(IS_FUNCTIONAL_STATE(NewState));
	if (NewState != DISABLE)
	{

		I2C->CR |= I2C_CR_MRSTPM;
	}
	else
	{
		I2C->CR &= (uint32_t)~(I2C_CR_MRSTPM);
	}
	
}							

/*---------------------------------------------------
 * 函数功能：使能主机模式下,时钟同步功能
 * 入口参数：NewState: ENABLE, DISABLE
 * 出口参数：None
 * 返回值  ：None
 * 编写日期：
 * 作者    ：
 *---------------------------------------------------*/
void I2C_ClockSyncCmd(FunctionalState NewState)
{
	/* Check the parameters */
	assert_param(IS_FUNCTIONAL_STATE(NewState));
	if (NewState != DISABLE)
	{

		I2C->CR |= I2C_CR_SYNC;
	}
	else
	{
		I2C->CR &= (uint32_t)~(I2C_CR_SYNC);
	}
}                                

/*--------------------------------------------
 * 函数功能：使能或使能I2C广播呼叫地址功能
 * 入口参数：NewState: ENABLE, DISABLE
 * 出口参数：None
 * 返回值  ：None
 * 编写日期：
 * 作者    ：
 *--------------------------------------------*/
void I2C_GeneralCallCmd(FunctionalState NewState)							        
{
	/* Check the parameters */
	assert_param(IS_FUNCTIONAL_STATE(NewState));  
	if (NewState != DISABLE)
	{
		I2C->CR |= I2C_CR_GCEN;
	}
	else
	{
		I2C->CR &= (uint32_t)~(I2C_CR_GCEN);
	}
} 

/*--------------------------------------------
 * 函数功能：配置本机7位/10位地址
 * 入口参数：I2C_AddressMode,Address
 *           I2C_AddressMode: I2C_AddressMode_7bit,I2C_AddressMode_10bit
 * 出口参数：None
 * 返回值  ：None
 * 编写日期：
 * 作者    ：
 *--------------------------------------------*/
void I2C_OwnAddressConfig(uint16_t I2C_AddressMode, uint16_t Address)
{
	assert_param(IS_I2C_AddressMode(I2C_AddressMode));
	
    if(I2C_AddressMode==I2C_AddressMode_7bit) 
	{
		assert_param(IS_I2C_Own_Address7bit(Address));
		Address=(uint16_t)(Address<<1);
	}
	else
		assert_param(IS_I2C_Own_Address10bit(Address));
		
	I2C->OAR=I2C_AddressMode|Address;	
}

/*------------------------------------------------
 * 函数功能：IIC软件复位使能
 * 入口参数：NewState: ENABLE, DISABLE
 * 出口参数：None
 * 返回值  ：None
 * 编写日期：
 * 作者    ：
 *------------------------------------------------*/
void I2C_SoftwareResetCmd(FunctionalState NewState)
{
	if(NewState==ENABLE)
	{
		I2C->CR |=I2C_CR_SWRST;
	}
	else
	{
		I2C->CR &= (uint32_t)~(I2C_CR_SWRST);
	}	
}

/*--------------------------------------------
 * 函数功能：配置和使能或使能I2C超时功能
 * 入口参数：Timeout;NewState
 * 出口参数：None
 * 返回值  ：None
 * 编写日期：
 * 作者    ：
 *--------------------------------------------*/
void I2C_ClockTimeoutConfig(uint16_t Timeout,FunctionalState NewState)
{
	/* Check the parameters */
	assert_param(IS_I2C_Timeout(Timeout));
	
	I2C->TOR=(uint16_t)Timeout;
	
	if (NewState != DISABLE)
	{
		I2C->TOR |= I2C_TOR_TIMEOUTEN;
	}
	else
	{
		I2C->TOR &= (uint32_t)~(I2C_TOR_TIMEOUTEN);
	}	
	
} 

/*------------------------------------------------------------
 * 函数功能：I2C中断配置
 * 入口参数：I2C_IT,NewState
 *           I2C_IT: I2C_IT_STTIE,I2C_IT_ADDRIE,I2C_IT_BTFIE,I2C_IT_ADDR10IE,I2C_IT_STOPIE,I2C_IT_RXIE,I2C_IT_TXIE\
 *			 I2C_IT_BERRIE,I2C_IT_ARLOIE,I2C_IT_NACKIE,I2C_IT_OVRIE,I2C_IT_TIMEOUTIE
 *           NewState: ENABLE, DISABLE
 * 出口参数：None
 * 返回值  ：None
 * 编写日期：
 * 作者    ：
 *------------------------------------------------------------*/
void I2C_ITConfig(uint32_t I2C_IT, FunctionalState NewState)
{
	/* Check the parameters */
	assert_param(IS_FUNCTIONAL_STATE(NewState));
	assert_param(IS_I2C_ITSource(I2C_IT));
	
	if (NewState != DISABLE)
	{	
		I2C->CR |= I2C_IT;
	}
	else
	{
		I2C->CR &= (uint32_t)~(I2C_IT);
	}
}

/*---------------------------------------
 * 函数功能：获取I2C的状态或中断标志位
 * 入口参数：I2C_FLAG
 * 出口参数：None
 * 返回值  ：bitstatus
 * 编写日期：
 * 作者    ：
 *---------------------------------------*/
FlagStatus I2C_GetFlagStatus(uint32_t I2C_FLAG)
{	
	assert_param(IS_I2C_StatusFlag(I2C_FLAG));
	
	FlagStatus bitstatus = RESET;	
	
	if((I2C->SR&I2C_FLAG) != 0x00)
	{

		bitstatus = SET;
	}
	else
	{

		bitstatus = RESET;
	}
	return bitstatus;
} 

/*---------------------------------------
 * 函数功能：清零I2C状态或中断标志位
 * 入口参数：I2C_Flag
 * 出口参数：None
 * 返回值  ：None
 * 编写日期：
 * 作者    ：
 *---------------------------------------*/
void I2C_ClearFlag(uint32_t I2C_Flag)
{ 
	/* Check the parameters */
	assert_param(IS_I2C_ClearFlag(I2C_Flag));	
	I2C->SR |= I2C_Flag;
}

/*-----------------------------
 * 函数功能：I2C发送数据
 * 入口参数：Data
 * 出口参数：None
 * 返回值  ：None
 * 编写日期：
 * 作者    ：
 *------------------------------*/
void I2C_SendData(uint8_t Data)
{
	I2C->TXDR =Data;
}

/*-----------------------------
 * 函数功能：I2C接收数据
 * 入口参数：None
 * 出口参数：None
 * 返回值  ：I2C接收的数据
 * 编写日期：
 * 作者    ：
 *------------------------------*/
uint8_t I2C_ReceiveData(void)
{  
	return (uint8_t)I2C->RXDR;
} 

/*------------------------------------------------------------
 * 函数功能：发送I2C的匹配地址
 * 入口参数：Address,I2C_Direction
 * 出口参数：
 * 返回值  ：
 * 编写日期：
 * 作者    ：
 *------------------------------------------------------------*/
void I2C_SendAddress(uint16_t Address,uint8_t I2C_Direction)
{
	assert_param(IS_I2C_Direction(I2C_Direction));
	
	uint8_t tmpreg=0;
	if(I2C->SR&I2C_SR_STT)  
	{
		if(!(I2C->OAR&I2C_OAR_ADDMODE)) 
		{
			assert_param(IS_I2C_Own_Address7bit(Address));
		    Address=(uint8_t)(Address<<1)|I2C_Direction;
	    }
		else
	    {
		   assert_param(IS_I2C_Own_Address10bit(Address));
		   tmpreg=(uint8_t)(((Address>>7)&0x06)|I2C_Direction_Write|0xf0); 
		   I2C_SendData(tmpreg);
	    }
		I2C_SendData((uint8_t) Address);
		
		if((I2C->OAR&I2C_OAR_ADDMODE)&&I2C_Direction_Read)
		{	
			I2C_GenerateStartCmd(ENABLE);
			I2C_SendData((uint8_t)(tmpreg|I2C_Direction));
		}	
	}

}

